//
//  ReadMe.swift
//  人员分配等问题介绍
//
//  Created by Apple on 16/10/22.
//  Copyright © 2016年 Apple. All rights reserved.
//

/*
 - 第五天
        - 下午内容
            - app 业务流程分析
                - 如果用户没有登录
                    - VisitorVc 
                    - 登录
                    - 登录成功
                    - 欢迎界面
                    - 欢迎界面动画完成后 
                    - 首页(没有访客视图)
                - 如果用户登录了
                    - 欢迎界面
                    - 首页(没有访客视图)
 
 
 
 
 
 
 
 
 
 
        - 第五天上午内容回顾
            - oauthVc 加载 webView -> loadView  -> view  = webView
            - 微博需要提供一个 urlString  appkey & 回调页 -> 
                - 登陆 open.weibo.com 
                - 注册-> 个人开发者
                - 登陆
                - 微链接 -> 移动应用 -> 继续创建 appkey appsecret
                - 高级信息 -> 设置授权回调页 -> 取消授权回调页
                - 测试信息 -> 该号码是未上下之前使用的号码(未来可能需要加好几个 -> 老板 -> 产品经理)
            - 通过 webView 代理方法 实时监听将要加载的 request
            - 通过一系列的判断 得到 code(授权码)
            - 为了获取 access_token  -> 请求新浪微博的接口 -> access_token, exprice_in uid
            - 需要个人信息信息数据 -> 昵称 和 头像
            - 因为我们当前模型使用的 YYModel 字典转模型(cocoapod 版本 YYModel 需要把的到的数据 response 判断是否可以转成字典 要不返回的为 nil)
            - 由于我们后期会多个模块可能使用当前个人用户信息模型, 而且防止频繁访问网络的接口 获取个人信息数据
                - 解决方式: 采用归档接档
            - 使用 YYModel 提供的 initCoder  encoder 就可以搞定   
            - 保存用户信息对象,而且会多次使用该对象
                - 解决方法:
                    - 使用单例
                    - 当前我们使用开发模式MVVM 模式 -> 数据处理 -> 需要 ViewModel 帮助控制器处理
                    - ViewModel中提供两个方法
                        - saveModel (保存对象到沙盒中)
                        - getModel (获取对象在沙盒中)
                    - 为了防止不频繁操纵沙盒 我们在单例中 创建一个用户信息对象 userAccounModel
                        - userAccounModel 第一次赋值 肯定在 init 方法中 然后调用getModel 完成赋值
                        - 会有 bug 当用户保存完数据后 userAccounModel 为 nil
                            - 解决方法: 在 外界调用saveModel 时候 程序员手动userAccounModel 赋值
            - 自定义类: 可以直接创建 Swift file 文件 需要我们手动 import UIKit 框架
                        class 自定类名{}
                    - 如果需要 init 方法 需要程序员自己手写 但是不需要加 override 和 super.init()
                            - 原因他根本没有父类 -> 孙悟空
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
        - 登录微博
        - 微链接 移动开发 - 继续创建
        - 高级信息  授权回调页 和取消授权回调页  
        - 测试信息 关联测试帐号
 
 
 
 
 
 ================================================================
 
 
- 第四天
 
    - 第四天下午内容回顾
        - pod 移除
        - 回顾 oc 单例的写法
        - 学习了 Swift 中单例的写法(和懒加载相似)
        - 回顾了 OC 中 afn 的网络封装 (封装一个公共方法 和 按照业务需求封装不同的请求方法)
        - 学习了 Swift 中 afn 的封装
            - Swift 中的枚举的定义 他不在单单支持以前的 int 类型 可以支持字符串
        - 搭建我们 OAuth 授权界面
        - 介绍 OAuth
 

    - OAuth 授权
        - 翻译 open auth 开发的授权
            - 便捷
            - 安全 
        - 第三方登录
            - 如果你是真机 直接可以完成 应用跳转 然后 得到授权后 直接可以登录你想登录的 app
            - 但是我们是模拟器 但是我们需要上课(OAuth 授权 -> webView 网页版)
 
        - 如果你使用OAuth 而且你开发的 app 需要用户的 name  age token
            - 为什么使用OAuth 授权登录
                - 就拿不到token 就没办法访问微博的公共借口
            - 使用微博登录  微博用户名 和 密码
            - 登录 -> 授权
            - 会给我们 app 一个 用户对应的 code(授权码)
            - 新浪微博 特殊提供一个借口 只要你传入code 我就会给你对应这个人的 token(爱鲜蜂中的 id)
            - 你通过新浪微博给你的token 拼接对应微博请求个人信息的数据借口就可以拿到用户对应的用户信息(name img age sex)
            - 我们 app 中 就有了用户的 name img age sex token
 
        - 如果我们使用的第三方登录 直接是真机 可以跳转到对应的授权 app 中
 
            - 如果支持第三方登录
                    - 注册用户
                        - 使用手机号直接注册
                        - 通过第三方登录返回的个人信息注册openid
 
    - 第四天上午内容总结
        - 按照效果图分析到(首页 消息 发现 我 未登录状态 显示的效果差不多)
            - 解决方案: 抽取基类(VisitorVc) 子控制器继承基类
        - 未登录状态 均要显示访客视图 view
            - loadView  & isLogin
                - false  没有登录 view = visitorView
                - true  登录了  super.loadView()
        - 自定义visitorView(为什么?  MVVM 模式 或者 MVC  应该做到 控制器和 view 隔离 所以要自定义)
                - 按照首页开发(为什么? 首页的控件是最多的)
                - 后期需要消息 发现 我  修改 logo 和 text
                        - 解决方法: 在VisitorVc 创建一个全局的visitorView 供 期继承VisitorVc 子类类调用visitorView 便于 visitorView调用期自己身上的方法
                - visitorView 暴露出的方法 采用的是 可选是参数 为了方便我们辨别出事首页还是其他子控制器
                    - 如果是首页 iconImageView 通过核心动画 叫他转起来
                            - 如果切换控制器或者 app 推到后台 会造成动画移除
                                -解决方法:isRemovedOnCompletion = false
                    - 如果是其他 设置 icon text 和隐藏 圆圈 imageView
        - 设置VisitorVc 导航 按钮
        - 把visitorView 中按钮的点击事件通过闭包抛到其父类 叫其帮助弹出控制器
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    - 访客视图分析
        - 当 app 运行起来 一共创建几个 visitorView 
        - 运行起来 一个4个子控制器  均继承 VisitorVC  -> 就会判断你是否登录 如果没有登录 -> 创建一个 visitorView
        - 你 首页 消息 发现 我 显示的 icon 不同 文字内容不同 (如果是首页的话 有圆圈还要设置动画 其他界面要隐藏圆圈)
            - icon 还有 messageLabel circleImageView  -> visitorView
        - 解决办法 我能不能在visitorView 类中 创建一个外界调用方法 统一在里面设置icon 还有 messageLabel circleImageView
 
 ================================================================
- 第三天
 
 
    - 第三天上午回顾
        - 闭包的循环引用(A-闭包-A)设计和解决方案
            - weak var weakSelf = self   == __weak
            - [weak self]     == __weak
            - [unowed self]   == __unsafe_
        - 项目部署到 osChina 上
            - 使用 ssh 公钥
            - 克隆项目
            - 添加忽略文件(一定要先添加)
            - 创建项目(对项目做一些相关的设置)
            - 通过业务需求 明细文件夹(MVVM)
            - MVVM
                - Model
                - View (view controller)
                - ViewModel
            - 创建主控制器(MainVc)
                    - HomeVc
                    - MessageVc
                    - Discover
                    - Profile
            - 添加以上四个子控制器(封装一个公共的方法 -> 用于创建子控制器和添加)
    - 第三天下午内容总结
        - 自定义 HMTabBar (因为我们要显示一个撰写按钮)
            - 手写代码创建HMTabBar 需要实现 init(frame) init(coder)
            - init(coder)为什么(防止其他人使用时候 用于创建 sb xib)
        - 抽取 button 的 extension
        - @objc (使用 oc 的消息运行机制来调用方法)
        - 使用 Swift 中的协议和代理 实现 撰写按钮点击告知 MainVc(闭包|| 直接调用属性)
        - 通过遍历获取HMTabBar subviews 通过 class 获取 对应的 uibarbutton 设置 frame
        - class == 类名.self   || NSClassFromString("私用控件")
        - 自定义 UIBarButtonItem 
        - 创建 tempVc 
        - 自定义 HMNavC
            - 因为设置自定义的返回按钮手势失效
                - 解决 interactivePopGestureRecognizer?.delegate = self
            - 首页还可以滑动 造成不能在正常 push
                - 解决:gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
            - 按照业务逻辑 首页是 <首页的 tilte  以后显示的 < 返回
                - 解决方法 通过监听导航控制器的 push 方法(重写)
                    - 如果 count> 0 设置左侧按钮 
                        - 如果 count == 1  == 首页的 title
 
 
        
 
 
 
 
 
 
 
 
 
 
 
    - 公司人员分配
        - 客户
        - 老板(发钱)
        - 技术总监(PC 端, 前端, 手机移动端, 产品, UI, 后台, 测试, 文员, 运营)
        - 手机移动端
            - 苹果
            - 安卓
        - H5
            - 开发移动端界面 和 PC 端
 
        - UI 
            - 效果图, 标注图, 切图
        - 后台
            - java php .net
        - 测试 
            - 公司自己开发, jira(收费) bugfree(免费)
        - -文员
            - 数据的录入或者审核
        - 运营
            - 对公司的产品进行宣传
 
 
    - 公司开发流程(如果是给别人做产品)
 
        - 销售和甲方沟通 (成功)
        - 产品和甲方沟通 (形成产品文档)
            - 需求文档
            - 设置原型 (h5, 手机移动端, 后台, UI, 沟通 -> 方案可实施性)
        - UI出效果图(老板或者技术总监审核, 给甲方审核)
        - UI出标注图和切图
        - 移动端和 H5开始开发 后台也会跟进
        - 以上开发完成 
        - 测试人员测试
        - 甲方需要再次审核 -> 返回修改 -> 在审核 -> 直到封板
        - iOS
            - 第一次上线审核的周期 2周左右
            - 以后 一周左右
            - 什么情况会造成审核不过
                - 主线程卡死
                - 如果你上传的是安卓的效果图
                - 你发布的是关于公司的而使用个人账号发布
                - 你的 app 需要登录 (你没有提供测试账号)
                - 你当前 app 使用了支付 (如果是虚拟金币或者你会收费是基于苹果的 就需要强行使用内购)
                    - 如果使用内购 (如果单价100  苹果30  你70)
        - 邓白氏编码(15-20天) 成功
        - 填一些信息
            - 等待苹果回访电话
            
        - 账号 99 199
 
        - 开发人员可能会写项目开发文档
            - 你要写清楚你的项目模块和使用了哪些技术
            - 各种账号
 
 
 
 
    - 项目部署问题
        - 使用 github 码云
         - github 国外 翻墙 (访问慢) -> 收费
         -  速度快 而且是国内产品 主要是不收费
 
    - SSH  (了解)
        - 客户端 生成 rsa 秘钥 + 公钥
        - 然后把rsa公钥 给服务器
        - 项目成功
        - 客户端 随机成功一个 aes (秘钥)
        - 通过aes 把 项目 加密
        - 然后吧项目(通过 aes 加密后的)通过网络发送到远程服务器
        - 然后通过rsa吧 aes 加密 发送到服务器
        - 然后服务器rsa公钥 解密得到aes(非加密)
        - 通过 aes 解密加密后的项目
        - 然后保存项目

 */










